﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionContrato;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionContrato;
using ClickLand.Web.UI.WebControls;

namespace AdministracionContrato
{
    /// <summary> Clase que hace de codebehing de la vista que muestra el cuadro de proyecciones por contrato </summary>
    public partial class CuadroProyeccion : Page, IProyeccionContrato
    {
        #region Atributos

        /// <summary> Variable que posee la definicion del presentador </summary>
        private PresentadorProyeccionContrato _presentador;
        #endregion

        #region Eventos
        

        /// <summary> Metodo que se ejeuta cuando se da inicia la pagina </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            //mvCuadroProyeccion.SetActiveView(vBusqueda);
            _presentador.CargarPagina();
            _presentador.BuscarContrato();
            var id = Convert.ToInt32(1);
            _presentador.MostrarCuadroProyecciones(id);
            mvCuadroProyeccion.SetActiveView(vCuadroProyecciones2);
        }


        /// <summary>Evento de inicializacion de la página.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Init(object sender, EventArgs e)
        {
            _presentador = new PresentadorProyeccionContrato(this);
        }


        /// <summary>Evento que se ejecuta cuando se da click al boton de buscar.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnBuscarContratosClick(object sender, EventArgs e)
        {
            _presentador.BuscarContrato();
        }
        

        /// <summary> Metodo que se ejecuta cuando se selecciona un contrato de la lista </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GvDatosContratosRowCommando(object sender, GridViewCommandEventArgs e)
        {
            var id = Convert.ToInt32(e.CommandArgument);
            _presentador.MostrarCuadroProyecciones(id);
            DataTable table = new DataTable();
            table.Columns.Add("Id");
            table.Rows.Add("1");
            mvCuadroProyeccion.SetActiveView(vCuadroProyecciones);

        }
        

        /// <summary> Metodo que se ejecuta cuando se da click al boton de regresar en la vista de proyecciones </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarProyeccion(object sender, EventArgs e)
        {
            mvCuadroProyeccion.SetActiveView(vBusqueda);
        }


        /// <summary> Metodo que se ejecuta cuando se crea fila por fila de la lista de proyecciones </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GvCuadroProyeccionRowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;

            for (int i = 0; i < 12; i++)
            {
                string funcion = "javascript:DuplicarMontoGrid({0},{1},{2},{3},{4})";
                var monto = (ClickLandTextBox)e.Row.FindControl("MontoMes" + i);
                var porcentaje = (ClickLandTextBox)e.Row.FindControl("PorcentajeMes" + i);
                monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],string.Format(funcion,i,12,monto.ClientID,e.Row.DataItemIndex,ListaProyeccion.Tables[0].Rows.Count));
                monto.Enabled = Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Seleccionar" + i]);
                porcentaje.Enabled = Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Seleccionar" + i]);
                if (!Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Pintar" + i])) continue;
                monto.BackColor = Color.Red;
                porcentaje.BackColor = Color.Red;
            }
        }


        /// <summary> Metodo que almacena los datos del cuadro de proyeccion </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnAceptarClick(object sender, EventArgs e)
        {
            _presentador.Guardar();
        }
        #endregion

        #region Propiedades
        

        /// <summary> Propiedad que obtiene y asigna el tipo de establecimiento para la busqueda </summary>
        public ClickLandDropDownList TipoEstablecimientoBusqueda
        {
            get { return ddlTipoEstablecimiento; }
            set { throw new NotImplementedException(); }
        }


        /// <summary> Propiedad que obtiene y asigna el establecimiento para la busqueda </summary>
        public EstablecimientoDto EstablecimientoBusqueda
        {
            get { return new EstablecimientoDto { Id = Convert.ToInt64(ddlEstablecimiento.SelectedValue) }; }
            set { throw new NotImplementedException(); }
        }


        /// <summary> Propiedad que obtiene el nombre comercial para la busqueda </summary>
        public string NombreComercialBusqueda
        {
            get { return tbNombreComercial.Text; }
            set { tbNombreComercial.Text = value; }
        }


        /// <summary> Propiedad que obtiene el nombre del cliente para la busqueda </summary>
        public string NombreClienteBusqueda
        {
            get { return tbNombreCliente.Text; }
            set { tbNombreCliente.Text = value; }
        }


        /// <summary> Propiuedad que asgina u obtiene la lista de contratos consultados </summary>
        public List<ContratoDto> ListaContratos
        {
            get { return (List<ContratoDto>)Session["ListaContratos"]; }
            set
            {
                Session["ListaContratos"] = value;
                gvDatosContratos.DataSource = value;
                gvProyecciones2.PageSize = value.Count;
                gvDatosContratos.DataBind();
            }
        }


        /// <summary> Propiedad que obtiene la lista de establecimientos </summary>
        public ClickLandDropDownList Establecimientos
        {
            get { return ddlEstablecimiento; }
        }


        /// <summary> preueba </summary>
        public string Prueba
        {
            set { }
        }


        /// <summary> Propiedad que obtiene la informacion del contrato </summary>
        public ContratoDto Contrato
        {
            get { return (ContratoDto)Session["Contrato"]; }
            set { Session["Contrato"] = value; }
        }


        /// <summary> Lista de proyecciones </summary>
        public DataSet ListaProyeccion
        {
            set
            {
                Session["ListaProyeccion"] = value;
                gvProyecciones2.DataSource = value;
                gvProyecciones2.DataBind();
            }
            get { return (DataSet) Session["ListaProyeccion"]; }

        }

        
        /// <summary> Propiedad que obtiene el gridview que muestra el cuadro de proyeccion </summary>
        public ClickLandGridView GvProyeccion
        {
            get { return gvCuadroProyeccion; }
        }


        /// <summary> Metodo que obtiene o asigna la lista de proyeccion almacenada en la base de datos </summary>
        public List<ProyeccionDto> ListaProyeccionAlmacenada
        {
            get { return (List<ProyeccionDto>) Session["ListaAlmacenada"]; }
            set { Session["ListaAlmacenada"] = value; }
        }

        #endregion

        /// <summary> Metodo que se encarga de manejar los titulos del grid </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GvCuadroProyeccion2RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                e.Row.Cells[0].Text = "N° Local";
                int pagina = gvProyecciones2.PageIndex;
                for (int i = 1; i < e.Row.Cells.Count - 1; i++)
                {
                    DateTime fecha = new DateTime(DateTime.Now.AddYears(pagina-1).Year,i,1);
                    e.Row.Cells[i].Text = fecha.ToString("MMM-yyyy");
                }
                var fila = e.Row.DataItem;
            }
            if (e.Row.RowType != DataControlRowType.DataRow) return;
            
            for (int i = 0; i < 12; i++)
            {
                string funcion = "javascript:DuplicarMontoGrid({0},{1},{2},{3},{4})";
                var monto = (ClickLandTextBox)e.Row.FindControl("MontoMes" + i);
                var porcentaje = (ClickLandTextBox)e.Row.FindControl("PorcentajeMes" + i);
                monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"], string.Format(funcion, i, 12, monto.ClientID, e.Row.DataItemIndex, ListaProyeccion.Tables[0].Rows.Count));
                monto.Enabled = Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Seleccionar" + i]);
                porcentaje.Enabled = Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Seleccionar" + i]);
                if (!Convert.ToBoolean(ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Pintar" + i])) continue;
                var color = Color.White;
                if(Color.Red.ToString() == (string) ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Color" + i])
                    color = Color.Red;
                else if(Color.Blue.ToString() == (string) ListaProyeccion.Tables[0].Rows[e.Row.DataItemIndex]["Color" + i])
                    color = Color.Blue;
                        
                monto.BackColor = color;
                porcentaje.BackColor = color;
            }
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton anterior de la paginacion de la proyeccion </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnAnteriorClick(object sender, EventArgs e)
        {

            if (gvProyecciones2.PageIndex > 0)
                gvProyecciones2.PageIndex--;
            gvProyecciones2.DataSource = ListaProyeccion;
            gvProyecciones2.DataBind();

            ConfigurarControles();

        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente de la paginacion </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguienteClick(object sender, EventArgs e)
        {
            if (gvProyecciones2.PageIndex < gvProyecciones2.PageCount)
                gvProyecciones2.PageIndex++;

            gvProyecciones2.DataSource = ListaProyeccion;
            gvProyecciones2.DataBind();
            ConfigurarControles();
        }

        
        /// <summary> Metodo que realiza las operaciones para configurar la visibilidad de los botones
        /// y el texto de información </summary>
        private void ConfigurarControles()
        {
            btnAnterior.Visible = (gvProyecciones2.PageIndex > 0);
            btnSiguiente.Visible = (gvProyecciones2.PageIndex < gvProyecciones2.PageCount - 1) &&
                             (gvProyecciones2.PageCount > 1);
        }

        /// <summary>
        /// Metodo que se ejecuta cuando se cambia el monto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CambiarMonto(object sender, EventArgs e)
        {
            var dato = posicionCambio.Value.Split(';');
            var cambio =
                float.Parse(((ClickLandTextBox)
                 gvProyecciones2.Rows[Convert.ToInt32(dato[0])%ListaContratos.Count].FindControl("MontoMes" + dato[1])).
                    Text);
            var dataSet = ListaProyeccion;
            float monto = 0;
            if ((dato[1] == "0") && (Convert.ToInt32(dato[0]) > ListaContratos.Count))
                monto =
                    float.Parse(
                        dataSet.Tables[0].Rows[Convert.ToInt32(dato[0]) - ListaContratos.Count][
                            "Monto" + 11].ToString());
            else if (dato[1] != "0")
                monto =
                    float.Parse(
                        dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Monto" + (Convert.ToInt32(dato[1]) - 1)].
                            ToString());

            var porcentaje = (cambio - monto) * 100 / monto;
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Monto" + dato[1]] = cambio.ToString("N");
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Porcentaje" + dato[1]] = porcentaje.ToString("N");
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Pintar" + dato[1]] = true;
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Color" + dato[1]] = Color.Blue.ToString();
            int pagina = gvProyecciones2.PageIndex;
            int numero = Convert.ToInt32(dato[0]);
            int mes = Convert.ToInt32(dato[1]);
            while (numero < (ListaContratos.Count * 5))
            {
                while(mes < 12)
                {
                    dataSet.Tables[0].Rows[numero]["Monto" + mes] = cambio.ToString("N");
                    dataSet.Tables[0].Rows[numero]["Porcentaje" + mes] = porcentaje.ToString("N");
                    mes++;
                }
                mes = 0;
                numero = numero + ListaContratos.Count;
            }
            ListaProyeccion = dataSet;
            gvProyecciones2.PageIndex = pagina;
        }

        protected void CambiarPorcentaje(object sender, EventArgs e)
        {
            var dato = posicionCambio.Value.Split(';');

            var porcentaje = float.Parse(((ClickLandTextBox)
                 gvProyecciones2.Rows[Convert.ToInt32(dato[0]) % ListaContratos.Count].FindControl("PorcentajeMes" + dato[1])).
                    Text);
            var dataSet = ListaProyeccion;
            float monto = 0;
            if ((dato[1] == "0") && (Convert.ToInt32(dato[0]) > ListaContratos.Count))
                monto =
                    float.Parse(
                        dataSet.Tables[0].Rows[Convert.ToInt32(dato[0]) - ListaContratos.Count][
                            "Monto" + 11].ToString());
            else if (dato[1] != "0")
                monto =
                    float.Parse(
                        dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Monto" + (Convert.ToInt32(dato[1]) - 1)].
                            ToString());


            var cambio = monto * (1 + (porcentaje / 100));
            

            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Monto" + dato[1]] = cambio.ToString("N");
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Porcentaje" + dato[1]] = porcentaje.ToString("N");
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Pintar" + dato[1]] = true;
            dataSet.Tables[0].Rows[Convert.ToInt32(dato[0])]["Color" + dato[1]] = Color.Blue.ToString();
            int pagina = gvProyecciones2.PageIndex;
            int numero = Convert.ToInt32(dato[0]);
            int mes = Convert.ToInt32(dato[1]);
            while (numero < (ListaContratos.Count * 5))
            {
                while (mes < 12)
                {
                    dataSet.Tables[0].Rows[numero]["Monto" + mes] = cambio.ToString("N");
                    dataSet.Tables[0].Rows[numero]["Porcentaje" + mes] = porcentaje.ToString("N");
                    mes++;
                }
                mes = 0;
                numero = numero + ListaContratos.Count;
            }
            ListaProyeccion = dataSet;
            gvProyecciones2.PageIndex = pagina;
        }
    }
}